package telas.produto;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableRowSorter;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.MaskFormatter;
import javax.swing.text.NumberFormatter;
import javax.swing.JTabbedPane;
import java.awt.SystemColor;
import javax.swing.JLabel;
import java.awt.Font;

import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ImageIcon;
import javax.swing.KeyStroke;
import javax.swing.RowFilter;
import javax.swing.SwingConstants;

import controle.produto.ControleProduto;
import controle.produto.ControleProdutoSwing;
import javax.swing.ListSelectionModel;

import telas.sistema.ListenerJTextField;

import modelo.Fachada;
import modelo.produto.Produto;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.DecimalFormat;
import java.text.NumberFormat;


public class TelaProduto extends JFrame {
	private JPanel pnlCadastrarProduto;
	private JPanel panelListar;
	private JTabbedPane tabbedPane;
	private JPanel contentPane;
	private JTextField tfCodBarras;    
	private JTextField tfDataValidade;    
	private JTextField tfEstoqueAtual;    	
	private JTextField tfCustoUnitario;  
	private JTextField tfMargemDeLucro;
	private JTextField tfMargemDeLucroAPrazo;
	private JTextField tfValorAVista;
	private JTextField tfValorAPrazo;
	private JTextField tfNome;
	private JTextField tfUnidadeDeMed;
	private JTextField tfBuscar;
	private JTable table;
	private JButton btnEditarProduto;
	private JButton btnSalvar;
	private JButton btnLimparDados;
	private JButton btnAlterarProduto;
	private JButton btnExcluirProduto;
	private boolean novoProduto = true;

	private Produto produtoSelecionado;
	private ProdutoTableModel model;
	private TableRowSorter<ProdutoTableModel> sorter;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TelaProduto frame = new TelaProduto();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public TelaProduto() {
		super("Produto");
		setResizable(false);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setSize(800, 600);
		setVisible(true);
		setLocationRelativeTo(null);

		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		tabbedPane.setBounds(0, 122, 794, 450);
		contentPane.add(tabbedPane);

		pnlCadastrarProduto = new JPanel();
		pnlCadastrarProduto.setBackground(SystemColor.controlHighlight);
		tabbedPane.addTab("Cadastrar Produto", null, pnlCadastrarProduto, null);
		pnlCadastrarProduto.setLayout(null);
		InputMap imap = pnlCadastrarProduto.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 

		imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true), "panel.save");


		// associate the names with actions

		ActionMap amap = pnlCadastrarProduto.getActionMap();
		amap.put("panel.save", new ControleProdutoSwing(this, new ControleProduto(), "save"));

		JLabel lblCadastrarDadosProduto = new JLabel("Cadastrar Dados do Produto");
		lblCadastrarDadosProduto.setFont(new Font("Tahoma", Font.BOLD, 18));
		lblCadastrarDadosProduto.setBounds(10, 11, 352, 19);
		pnlCadastrarProduto.add(lblCadastrarDadosProduto);

		JLabel lblDescricao = new JLabel("Nome do Produto");
		lblDescricao.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblDescricao.setBounds(10, 41, 160, 15);
		pnlCadastrarProduto.add(lblDescricao);

		tfNome = new JTextField();
		tfNome.setColumns(10);
		tfNome.setBounds(10, 56, 385, 20);
		pnlCadastrarProduto.add(tfNome);

		JLabel lblEstoqueAtual = new JLabel("Estoque Atual");
		lblEstoqueAtual.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblEstoqueAtual.setBounds(143, 88, 87, 15);
		pnlCadastrarProduto.add(lblEstoqueAtual);

		tfEstoqueAtual = new JTextField();  
		tfEstoqueAtual.setColumns(10);
		tfEstoqueAtual.setBounds(143, 103, 120, 20);
		pnlCadastrarProduto.add(tfEstoqueAtual);
//		tfEstoqueAtual.getDocument().addDocumentListener(new ListenerJTextField(tfEstoqueAtual));

		JLabel lblDataValidade = new JLabel("Data de Validade");
		lblDataValidade.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblDataValidade.setBounds(598, 41, 160, 15);
		pnlCadastrarProduto.add(lblDataValidade);

		JLabel lblUnidadeDeMed = new JLabel("Unidade de Medida");
		lblUnidadeDeMed.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblUnidadeDeMed.setBounds(10, 88, 115, 15);
		pnlCadastrarProduto.add(lblUnidadeDeMed);

		JLabel lblCodBarras = new JLabel("C\u00F3digo de Barras");
		lblCodBarras.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblCodBarras.setBounds(407, 41, 115, 15);
		pnlCadastrarProduto.add(lblCodBarras);

		tfDataValidade = new JTextField();  
		tfDataValidade.setColumns(10);
		tfDataValidade.setBounds(598, 56, 179, 20);
		pnlCadastrarProduto.add(tfDataValidade);
		
		tfCodBarras = new JTextField();  
		tfCodBarras.setColumns(10);
		tfCodBarras.setBounds(407, 56, 179, 20);
		pnlCadastrarProduto.add(tfCodBarras);
//		tfCodBarras.getDocument().addDocumentListener(new ListenerJTextField(tfCodBarras));
	
		tfUnidadeDeMed = new JTextField();
		tfUnidadeDeMed.setColumns(10);
		tfUnidadeDeMed.setBounds(10, 103, 120, 20);
		pnlCadastrarProduto.add(tfUnidadeDeMed);
 
		tfCustoUnitario = new JTextField(); 
		tfCustoUnitario.setColumns(10);
		tfCustoUnitario.setBounds(275, 103, 120, 20);
		pnlCadastrarProduto.add(tfCustoUnitario);

		tfMargemDeLucro = new JTextField();
		tfMargemDeLucro.setColumns(10);
		tfMargemDeLucro.setBounds(407, 103, 179, 20);
		pnlCadastrarProduto.add(tfMargemDeLucro);

		tfMargemDeLucroAPrazo = new JTextField();
		tfMargemDeLucroAPrazo.setColumns(10);
		tfMargemDeLucroAPrazo.setBounds(598, 103, 179, 20);
		pnlCadastrarProduto.add(tfMargemDeLucroAPrazo);

		JLabel lblCustoUnitario = new JLabel("Custo Unit\u00E1rio");
		lblCustoUnitario.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblCustoUnitario.setBounds(275, 88, 87, 15);
		pnlCadastrarProduto.add(lblCustoUnitario);

		JLabel lblMargemDeLucro = new JLabel("Margem de Lucro");
		lblMargemDeLucro.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblMargemDeLucro.setBounds(407, 88, 104, 15);
		pnlCadastrarProduto.add(lblMargemDeLucro);

		JLabel lblMargemDeLucroAPrazo = new JLabel("Marg. de Lucro \u00E0 Prazo");
		lblMargemDeLucroAPrazo.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblMargemDeLucroAPrazo.setBounds(598, 88, 134, 15);
		pnlCadastrarProduto.add(lblMargemDeLucroAPrazo);

		JLabel lblValorAVista = new JLabel("Valor \u00E0 Vista");
		lblValorAVista.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblValorAVista.setBounds(10, 135, 87, 15);
		pnlCadastrarProduto.add(lblValorAVista);

		tfValorAVista = new JTextField();
		tfValorAVista.setColumns(10);
		tfValorAVista.setBounds(10, 150, 120, 20);
		pnlCadastrarProduto.add(tfValorAVista);

		JLabel lblValorAPrazo = new JLabel("Valor a Prazo");
		lblValorAPrazo.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblValorAPrazo.setBounds(143, 135, 87, 15);
		pnlCadastrarProduto.add(lblValorAPrazo);

		tfValorAPrazo = new JTextField();
		tfValorAPrazo.setColumns(10);
		tfValorAPrazo.setBounds(143, 151, 120, 20);
		pnlCadastrarProduto.add(tfValorAPrazo);

		btnSalvar = new JButton("Salvar (Enter)");
		btnSalvar.setIcon(new ImageIcon(TelaProduto.class.getResource("/telas/sistema/figuras/disk.png")));
		btnSalvar.setBounds(10, 387, 145, 23);
		btnSalvar.addActionListener(new ControleProdutoSwing(this, new ControleProduto()));
		pnlCadastrarProduto.add(btnSalvar);

		JButton btnLimparDados_1 = new JButton("Limpar Dados");
		btnLimparDados_1.setIcon(new ImageIcon(TelaProduto.class.getResource("/telas/sistema/figuras/bullet_page_white.png")));
		btnLimparDados_1.setBounds(167, 387, 145, 23);
		pnlCadastrarProduto.add(btnLimparDados_1);

		panelListar = new JPanel();
		panelListar.setBackground(SystemColor.controlHighlight);
		tabbedPane.addTab("Listar Produtos", null, panelListar, null);
		panelListar.setLayout(null);

		tabbedPane.addChangeListener(new ControleProdutoSwing(this, new ControleProduto()));

		tfBuscar = new JTextField() {
			@Override
			public void paint(Graphics g) {
				super.paint(g);
				g.drawImage(new ImageIcon(TelaProduto.class.getResource("/telas/sistema/figuras/zoom.png")).getImage(),
						275, 2, null);

			}
		};
		tfBuscar.setColumns(10);
		tfBuscar.setBounds(10, 7, 302, 20);
		panelListar.add(tfBuscar);
		tfBuscar.getDocument().addDocumentListener(new ControleProdutoSwing(this, new ControleProduto()));

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(10, 33, 767, 336);
		panelListar.add(scrollPane);
		model = new ProdutoTableModel();
		sorter = new TableRowSorter<ProdutoTableModel>(model);
		table = new JTable(model);
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		table.setBackground(SystemColor.info);
		table.setAutoCreateRowSorter(true);
		table.setRowSorter(sorter);
		table.addKeyListener(new ControleProdutoSwing(this, new ControleProduto()));
		//		table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		DefaultTableCellRenderer centralizado = new DefaultTableCellRenderer();  
		centralizado.setHorizontalAlignment(SwingConstants.CENTER); 
//				centralizado.setBackground(Color.RED);
		table.getColumnModel().getColumn(0).setPreferredWidth(60);
		table.getColumnModel().getColumn(0).setCellRenderer(centralizado);
		table.getColumnModel().getColumn(1).setCellRenderer(centralizado);
		table.getColumnModel().getColumn(1).setPreferredWidth(500);
		table.getColumnModel().getColumn(2).setCellRenderer(centralizado);
		table.getColumnModel().getColumn(2).setPreferredWidth(80);
		table.getColumnModel().getColumn(3).setCellRenderer(centralizado);
		table.getColumnModel().getColumn(3).setPreferredWidth(80);

		//TODO

		scrollPane.setViewportView(table);

		btnAlterarProduto = new JButton("Alterar Produto");
		btnAlterarProduto.setBounds(10, 479, 130, 23);
		panelListar.add(btnAlterarProduto);


		btnEditarProduto = new JButton("  Editar Produto (F2)");
		btnEditarProduto.addActionListener(new ControleProdutoSwing(this, new ControleProduto()));
		//TODO
		btnEditarProduto.setIcon(new ImageIcon(TelaProduto.class.getResource("/telas/sistema/figuras/page_edit.png")));
		btnEditarProduto.setBounds(10, 384, 173, 26);
		panelListar.add(btnEditarProduto);

		btnExcluirProduto = new JButton("Excluir Produto (delete)");
		btnExcluirProduto.setIcon(new ImageIcon(TelaProduto.class.getResource("/telas/sistema/figuras/bullet_cross.png")));
		btnExcluirProduto.setBounds(195, 384, 187, 26);
		btnExcluirProduto.addActionListener(new ControleProdutoSwing(this, new ControleProduto()));

		panelListar.add(btnExcluirProduto);

		JLabel logo = new JLabel("");
		logo.setIcon(new ImageIcon(TelaProduto.class.getResource("/telas/sistema/figuras/logo.com.fundo.png")));
		logo.setBounds(0, 0, 794, 144);
		contentPane.add(logo);

	}

	public JTextField getTfDescricao() {
		return tfNome;
	}

	public JTextField getTfEstoqueAtual() {
		return tfEstoqueAtual;
	}

	public JTextField getTflblDataValidade() {
		return tfDataValidade;
	}

	public JTextField getTfUnidadeDeMed() {
		return tfUnidadeDeMed;
	}

	public JTextField getTfCustoUnitario() {
		return tfCustoUnitario;
	}

	public JTextField getTfMargemDeLucro() {
		return tfMargemDeLucro;
	}

	public JTextField getTfMargemDeLucroAPrazo() {
		return tfMargemDeLucroAPrazo;
	}

	public JTextField getTfValorAVista() {
		return tfValorAVista;
	}

	public JTextField getTfValorAPrazo() {
		return tfValorAPrazo;
	}

	public JTextField getTfBuscar() {
		return tfBuscar;
	}

	public JButton getBtnSalvar() {
		return btnSalvar;
	}

	public JButton getBtnLimparDados() {
		return btnLimparDados;
	}

	//	public JButton getBtnBuscar() {
	//		return btnBuscar;
	//	}
	//
	//	public JButton getBtnLimparBusca() {
	//		return btnLimparBusca;
	//	}

	public JButton getBtnAlterarProduto() {
		return btnAlterarProduto;
	}

	public JButton getBtnExcluirProduto() {
		return btnExcluirProduto;
	}

	public boolean isNovoProduto() {
		return novoProduto;
	}
	public void setNovoProduto(boolean novoProduto) {
		this.novoProduto = novoProduto;
	}

	public ProdutoTableModel getModel() {
		return model;
	}
	public JButton getBtnEditarProduto() {
		return btnEditarProduto;
	}
	//TODO

	public JPanel getPanelListar() {
		return panelListar;
	}

	public JTabbedPane getTabbedPane() {
		return tabbedPane;
	}

	public JTable getTable() {
		return table;
	}

	public Produto getProdutoSelecionado() {
		return produtoSelecionado;
	}
	//TODO
	public void setProdutoSelecionado(Produto produtoSelecionado) {
		this.produtoSelecionado = produtoSelecionado;
		tfCodBarras.setText(produtoSelecionado.getCodigoDeBarras());
		tfCustoUnitario.setText(""+produtoSelecionado.getCustoUnitario());
		tfNome.setText(produtoSelecionado.getDescricao());
		tfEstoqueAtual.setText(""+produtoSelecionado.getEstoqueAtual());
		tfDataValidade.setText(""+produtoSelecionado.getDataDeValidade());
		tfMargemDeLucro.setText(""+produtoSelecionado.getMargemDeLucro());
		tfMargemDeLucroAPrazo.setText(""+produtoSelecionado.getMargemDeLucroAPrazo());
		tfUnidadeDeMed.setText(produtoSelecionado.getUnidadeDeMedida());
		tfValorAPrazo.setText(""+produtoSelecionado.getValorAPrazo());
		tfValorAVista.setText(""+produtoSelecionado.getValorAVista());
	}
	public void resetTela() {
		tfCodBarras.setText("");
		tfCustoUnitario.setText("");
		tfNome.setText("");
		tfEstoqueAtual.setText("");
		tfDataValidade.setText("");
		tfMargemDeLucro.setText("");
		tfMargemDeLucroAPrazo.setText("");
		tfUnidadeDeMed.setText("");
		tfValorAPrazo.setText("");
		tfValorAVista.setText("");

	}
	

	public JTextField getTfCodigoDeBarras() {
		return tfCodBarras;
	}

	public TableRowSorter<ProdutoTableModel> getSorter() {
		return sorter;
	}
	public JPanel getPanelAddEdit() {
		return pnlCadastrarProduto;
	}

}
